
Apps zu schreiben ist toll. Wenn wir das doch nur tun könnten, anstatt uns mit dem ganzen Prozess herumzuschlagen, sie zum Laufen zu bringen, oder? Ich sage oft, dass Apps wie Flugzeuge sind: Wenn sie erst mal in der Luft sind, ist die Wahrscheinlichkeit groß, dass sie reibungslos weiterlaufen, sofern man die App richtig gebaut hat. Probleme gibt es meist beim Start und bei der Landung – auch bekannt als Deployment.
In diesem Blogbeitrag tauche ich kurz in die Geschichte der App-Bereitstellung ein und schaue mir an, was sich verändert hat, was gut funktioniert hat und was auf diesem Weg nicht so toll war.
Heute wärst du schockiert, wenn du wüsstest, welche riesigen Systeme auf diese Weise bereitgestellt wurden, und du würdest es wahrscheinlich für verrückt halten – aber es hat auch Spaß gemacht und war spannend! Du hattest etwas zu ändern. Du hast auf das Symbol deines Lieblings-FTP-Clients doppelgeklickt (ja, wir haben Windows benutzt). Du navigiertest zu einer Datei. Doppelklick. Etwas ändern. Speichern. Voilà, Änderung übernommen. Wir haben nicht so viele Frameworks verwendet. Also hattest du wahrscheinlich irgendwo eine riesige PHP-Datei. Und deine Änderung war lokal begrenzt. Und wenn etwas kaputtging? Na ja, dann hast du einfach nochmal doppelgeklickt und das korrigiert. Bei Zykluszeiten von Sekunden war das kein Problem. Naja, bis es eines Tages doch eines wurde.
Oft genug lief deine App auf einem einzigen Server, der ausschließlich für diesen Zweck vorgesehen war. Darauf lief die Datenbank, die du brauchst, oder wenn du etwas ressourcenintensiveres betriebst, hattest du wahrscheinlich einen separaten Server für die Datenbank – was wir als mehrschichtige Bereitstellungen bezeichneten. Und normalerweise kümmerte sich jemand anderes darum (der Datenbankadministrator).
1998 gab es bei Apache bereits sogenannte virtuelle Hosts, die es ermöglichten, mehrere Websites auf demselben Rechner zu hosten, was dazu führte, dass die Leute immer mehr Anwendungen auf denselben Server packten. Wenn du also eine Datei im falschen Verzeichnis geändert hast … na ja.
Zu dieser Zeit hast du vielleicht schon mit echten Profis zusammengearbeitet und warst auf El Reg und Slashdot unterwegs, sodass du bereits einen Anschein von Aufgabentrennung hattest. Wenn das der Fall war, hattest du eigentlich schon einen Testserver und hast das Ganze auf der Staging-Umgebung durchgeführt. Und dann hat irgendein Systemadministrator die Daten in der Produktivumgebung kopiert, was gut funktionierte – bis es nicht mehr funktionierte.
Mittlerweile waren die Profis noch ernsthafter geworden und wollten tatsächlich die Kontrolle über das haben, was sie bereitstellten. Und die Entwickler fingen auch an, Ordner mit Namen wie „production_v12_final_final_backup_charles_final“ zu hassen.
Also fingen wir an, SVN zu nutzen, und etwas in der Produktivumgebung zu bringen bedeutete meist „SVN up“ – was langsam, mühsam und oft fehleranfällig war. Aber es war die seriöse Art, die Dinge anzugehen. Die Schlauen lernten, wie man Symlinks nutzt, zuerst „SVN up“ durchführt und dann in das Web-Root-Verzeichnis wechselt. Es war wie GitOps ohne das „Ops“ und mit „Pull“ statt „Push“.
Trotzdem lief alles noch auf einem Single-Base-System. Dependency hatte in dieser Zeit seine Blütezeit. Und meistens waren Staging und Produktion mittlerweile schon lange nicht mehr synchron. Das war die Zeit, in der „Auf meinem Rechner funktioniert es“ zum geflügelten Wort wurde.
Du würdest staunen, wie viel Zeug immer noch so läuft – man geht auf eine Webseite und kann aus einer Reihe von bereitstellbaren Vorlagen für verschiedene Apps auswählen (meist PHP, später aber viel mehr). Und hier passierte etwas Interessantes. Die Bereitstellung von Anwendungen wurde so viel einfacher. Ein Klick.
Wie sich jedoch herausstellte, erschwert dies die Wartung der Anwendungen umso mehr. Wenn die Bereitstellung einfach, die Aktualisierung aber schwierig ist, ist das nicht gerade ideal. In der Regel ermöglichten diese Tools nicht nur die Bearbeitung per FTP, sondern stellten auch einen Web-Client zur Verfügung, sodass man gar nicht wissen musste, wie man eine Verbindung zu FTP herstellt.
Die Virtualisierung hatte enorme Auswirkungen – plötzlich konnten wir Anwendungen von der Hardware trennen. Jetzt konnte man tatsächlich ein Maschinen-Image erstellen und dieses anstelle der Anwendung bereitstellen.
Dieses Thema wird viel später in Form von Containern wieder auftauchen. Noch wichtiger war, dass man nun unterschiedliche Basen nutzen konnte. Aber das Erstellen von Images war eine komplexe Angelegenheit. Die Bereitstellung dauerte lange. Einige nutzten die neuen Tools, um neue Arbeitsweisen einzuführen. Andere behandelten die VM-basierten Maschinen weiterhin als etwas, für das sie FTP oder SVN nutzten. Mit denselben Ergebnissen.
Irgendwann hatten Softwareentwickler wie ich die Auseinandersetzungen mit den Systemadministratoren wirklich satt. Wir wurden schlecht behandelt. Und wir konnten programmieren.
Also beschlossen wir, das Problem einfach wegzuprogrammieren. Das nennen wir bis heute DevOps. Es gab hauptsächlich zwei Varianten davon:
Die Server gehörten zwar immer noch den Systemadministratoren, aber 2006 war EC2 bereits ein fester Begriff. Als Entwickler konnte man tatsächlich Zugriff auf eine laufende Maschine erhalten, ohne um Erlaubnis fragen zu müssen. Doch die Denkweise hatte sich noch nicht geändert. Und Entwickler mit wenig Sicherheitsschulung wurden in den meisten Fällen schnell (P)owned.
Dennoch: Wenn eure Systemadministratoren damals modern genug waren, erlaubten sie euch allmählich, direkt zu deployen. Zumindest in die Staging-Umgebung. Denn das waren auch die Jahre des Dreigespanns: Dev-Staging-Prod. Wir waren automatisiert genug, um (unter großen Mühen) alle drei zu warten. Was besser war als Staging-Prod. Dennoch driftete das Staging ab, und Dev befand sich fast immer in verschiedenen Stadien der Fehlfunktion.
Das ist die Phase, über die wir am liebsten sprechen, weil wir selbst ein PaaS-Anbieter sind. Und auch wenn wir gerne über uns selbst reden würden, müssen wir unseren Vorgängern Respekt zollen.
Zu diesem Zeitpunkt hatten wir bereits die Freiheit des direkten Deploys und die Umständlichkeit der kontinuierlichen Integration kennengelernt. Die meisten von uns, die sich voll und ganz daran gewöhnt hatten, wie hässlich Computer sind und dass jede Software fehlerhaft ist, akzeptierten dies als Teil der Kosten, die das Geschäft mit sich bringt. Nur dass in diesen Jahren noch etwas anderes passierte: Ruby und Ruby on Rails. Ein Game-Changer mit einem ganz eigenen Sinn für Ästhetik. Ruby-Leute legten mehr Wert auf Schönheit und Einfachheit als auf alles andere.
Damals befanden wir uns auf dem Höhepunkt des Moore’schen Gesetzes – Computer wurden immer schneller und selbst dein langsames Programm würde mit der Zeit schneller werden, warum also nicht stattdessen auf seine Lesbarkeit und Schönheit setzen?
Tests wurden in der Ruby-Welt nicht als „notwendiges Übel, weil die Sprache ein unsicheres Durcheinander ist“ angesehen, sondern als Beweis dafür, dass man das System in einfachen Begriffen durchdacht hat. Um es mit den Worten des französischen Dichters Boileau zu sagen: „Was wir gut begreifen, drückt sich klar aus, und die Worte dafür kommen leicht.“
Ein weiterer wichtiger Faktor war Git, das schnell genug auf den Markt kam und SVN verdrängte.
Es gibt einen riesigen Unterschied in der Absicht zwischen `svn up` und `git push`. Aber das Wichtigste war, dass Git das Erstellen von Branches kostengünstig und schnell machte. Die Leute von Heroku, mit ihrer Liebe zur Einfachheit und zur ruby-Ästhetik, sagten im Grunde: Server und cloud-Server sind jetzt „Vieh“. Was Systemadministratoren für uns tun, kann und sollte automatisiert werden. Wir werden alles vereinfachen und dir eine einzige Laufzeitumgebung und eine einzige Datenbank zur Verfügung stellen. Immer gleich; kein Ausweichen von den Vorgaben. Auf diese Weise kannst du `git push` ausführen und dein Programm läuft auf einem öffentlich zugänglichen Server.
Das hätte das Ende der Geschichte sein können, das letzte Wort, aber Heroku wurde schon früh von Salesforce aufgekauft. Das soll keineswegs heißen, dass Salesforce ein schlechter Verwalter war – sie haben im Laufe der Zeit sogar ein paar Laufzeitumgebungen hinzugefügt –, aber der Dienst blieb im Großen und Ganzen so, wie er war, und ignorierte alles um ihn herum, was in den nächsten 15 Jahren kommen würde. Und das Versäumnis von Heroku, mit der Zeit zu gehen, machte die Leute misstrauisch gegenüber der Idee.
Die PaaS hätte das sein können, was Entwicklern die Freiheit gab, sich ohne unnötigen Aufwand und Bürokratie auszudrücken, aber innerhalb der vorgegebenen Grenzen zu bleiben, fühlt sich nicht so an.
Aber selbst wenn man sich an die Vorgaben hielt, ließen Heroku und seine minderwertigen Nachahmer von Google und AWS (AppEngine und Beanstalk) dem Entwickler (und mittlerweile dem DevOps-Team) noch eine ganze Menge Ärger. Es konnte zwar in der Produktivumgebung arbeiten, doch Continuous Integration, Entwicklungs-Staging und alles, was über die einzelne Laufzeitumgebung und die zugehörige verwaltete Datenbank hinausging, wurden nur als Nebensache behandelt. Dabei handelte es sich um den Großteil dessen, was jedes ausgereifte Softwareunternehmen benötigt.
Darauf kommen wir noch zurück, wenn wir über Upsun Cloud sprechen, aber das ist im Wesentlichen die Wette, auf die wir gesetzt haben: Dass man den gesamten Prozess in einem einzigen Dienst zusammenfassen kann – denn eine echte Platform-as-a-Service muss eine Plattform für den gesamten Continuous-Delivery-Zyklus sein.
Um beim Thema PaaS zu bleiben: Zwei der Probleme, die die frühen PaaS-Systeme nicht lösten, waren die lokale Ausführung von Software und die Ausführung von Microservices. Microservices konnten damals nicht lokal ausgeführt werden, da dies im Grunde unmöglich war.
Bei den frühen PaaS-Systemen ging es um Vereinfachung, und wie gesagt, sie konzentrierten sich auf den spezifischen Anwendungsfall eines einzelnen Monolithen mit einer einzigen verwalteten Datenbank.
Im Laufe der Jahre ging der Trend in Richtung mehr Automatisierung, besserer Abstraktion und einer verbesserten Entwicklererfahrung. Während sich das Web und die damit verbundenen Technologien weiterentwickeln, werden sich auch die Bereitstellungsmethoden und -tools weiter verändern, um neuen Herausforderungen und Chancen gerecht zu werden.
In diesem Beitrag sind vor allem zwei Trends wichtig, die sich auf die aktuelle Entwicklung beziehen:
Während Kubernetes als Tool zur Orchestrierung von Containern begann, reicht sein Einfluss mittlerweile weit darüber hinaus und hat die Bereitstellungslandschaft grundlegend verändert. Es hat dazu beigetragen, dass sich Muster wie Microservices durchsetzen konnten, neue Paradigmen wie GitOps beflügelt und ein riesiges Ökosystem aus Tools und Erweiterungen ins Leben gerufen.
Upsun Cloud versucht, die gesamte oben beschriebene Entwicklung zusammenzufassen und das, was funktioniert, in eine übersichtliche Self-Service-Lösung zu bündeln:
Upsun Cloud ermöglicht es Entwicklern beispielsweise, ihre Produktionsumgebung für Entwicklung, Tests oder Staging zu klonen. So wird sichergestellt, dass sich die Anwendung in allen Phasen einheitlich verhält, was das Risiko unerwarteter Verhaltensweisen in der Produktivumgebung aufgrund von Umgebungsunterschieden verringert.
Viele moderne PaaS-Plattformen verfügen über integrierte Pipelines für Continuous Integration und Continuous Deployment, die sicherstellen, dass Programme nahtlos getestet und bereitgestellt werden. Diese Integration reduziert den Bedarf an Tools von Drittanbietern und optimiert den Prozess von der Entwicklung bis zur Bereitstellung.
Dank automatischer Skalierungsfeatures können PaaS-Lösungen schwankende Zugriffslasten ohne manuelles Eingreifen bewältigen. Sie können Ressourcen nach Bedarf zuweisen und so für optimale performance und Kosteneffizienz sorgen.
Moderne PaaS-Lösungen verfügen oft über integrierte Sicherheitsfeatures, darunter automatische Patches, sichere Netzwerkkonfigurationen und Compliance-Zertifizierungen. Diese integrierte Sicherheit bedeutet weniger manuelle Konfiguration und weniger Tools von Drittanbietern, wodurch potenzielle Fehlerquellen reduziert werden.
Da der Bedarf an mehreren Tools und Diensten sinkt, kann PaaS zu Kosteneinsparungen führen. Unternehmen müssen nicht für jedes einzelne Tool Fachwissen aufbauen, und die Betriebskosten lassen sich dank der Skaleneffekte, die PaaS-Anbieter erzielen, senken.
Zusammenfassend lässt sich sagen, dass die Entwicklung der Tools unsere Sichtweise auf Anwendungsbereitstellung und Infrastruktur verändert hat – und jedes dieser Tools bringt seine eigenen Komplexitäten mit sich. Moderne PaaS-Lösungen wie Upsun Cloud sind eine Antwort auf den Bedarf an einfacheren, einheitlichen und zukunftssicheren Bereitstellungsmethoden. Da sich die Technologie ständig weiterentwickelt, ist die Fähigkeit, mit minimalem Aufwand agil und anpassungsfähig zu bleiben, ein entscheidender Vorteil, der PaaS für viele Unternehmen zu einer attraktiven Wahl macht.
Möchtest du es mal ausprobieren? Starte noch heute deine kostenlose Testphase.